/**
 * 偏函数工具函数
 * @param {Function} fn 被偏函数化函数
 * @returns 偏函数化后的函数
 */
function partial (fn) {
  var slice = Array.prototype.slice
  var shift = Array.prototype.shift
  var args = slice.call(arguments, 1)
  return function () {
    var _args = args.slice()
    var newArgs = slice.call(arguments)
    for (var i = 0; i < _args.length; i++) {
      var arg = _args[i]
      if (arg === '_') {
        _args.splice(i, 1, shift.call(newArgs))
      }
    }
    return fn.apply(this, _args.concat(newArgs))
  }
}

export default partial